package com.proxy.service.impl;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;

/**
 * CGLIB代理工厂
 *
 * @author 李坤
 * @date 2022/4/17 16:40
 */
public abstract class CglibProxy {


    /**
     * 获取给定对象的代理对象
     *
     * @param target      被代理对象的类型
     * @param interceptor 代理类增强器
     * @param <T>         被代理类类型
     *
     * @return 代理对象
     */
    public static <T> T getProxy4Obj(T target, MethodInterceptor interceptor) {
        return (T) CglibProxy.getProxy(target.getClass(), interceptor);
    }

    /**
     * 获取给定类的代理对象
     *
     * @param clazz       被代理类类型
     * @param interceptor 代理类增强器
     * @param <T>         被代理类类型
     *
     * @return 代理对象
     */
    public static <T> T getProxy(Class<T> clazz, MethodInterceptor interceptor) {
        // 创建加强器，用来创建动态代理类
        Enhancer enhancer = new Enhancer();

        // 设置代理类的父类
        enhancer.setSuperclass(clazz);
        // 定义代理逻辑对象
        enhancer.setCallback(interceptor);

        return (T) enhancer.create();
    }

}
